// 全局命名空间下的模拟点击工具
window.NativeClickSimulator = (function() {
  /**
   * 模拟点击指定元素
   * @param {HTMLElement} element - 要点击的元素
   * @param {Object} options - 点击选项
   * @param {number} options.clientX - 点击的X坐标
   * @param {number} options.clientY - 点击的Y坐标
   * @param {boolean} options.bubbles - 是否冒泡
   * @param {boolean} options.cancelable - 是否可取消
   * @returns {boolean} 事件是否被触发
   */
  function simulateClick(element, options = {}) {
    if (!(element instanceof HTMLElement)) {
      throw new Error('第一个参数必须是HTMLElement实例');
    }

    // 计算元素默认坐标（中心位置）
    const rect = element.getBoundingClientRect();
    const defaultX = rect.left + rect.width / 2;
    const defaultY = rect.top + rect.height / 2;

    // 合并选项，设置默认值
    const clickOptions = {
      clientX: defaultX,
      clientY: defaultY,
      bubbles: true,
      cancelable: true,
      view: window,
      ...options
    };

    // 触发完整的鼠标事件序列
    ['mousedown', 'mouseup', 'click'].forEach(eventType => {
      const event = new MouseEvent(eventType, clickOptions);
      element.dispatchEvent(event);
    });

    return true;
  }

  /**
   * 通过选择器模拟点击元素
   * @param {string} selector - CSS选择器
   * @param {Object} options - 点击选项
   * @returns {boolean} 事件是否被触发
   */
  function simulateClickBySelector(selector, options = {}) {
    const element = document.querySelector(selector);
    if (!element) {
      throw new Error(`未找到匹配选择器 "${selector}" 的元素`);
    }
    return simulateClick(element, options);
  }

  /**
   * 模拟右键点击
   * @param {HTMLElement} element - 要点击的元素
   * @param {Object} options - 点击选项
   * @returns {boolean} 事件是否被触发
   */
  function simulateRightClick(element, options = {}) {
    return simulateClick(element, {
      button: 2, // 右键标识
      ...options
    });
  }

  // 暴露公共方法
  return {
    simulateClick,
    simulateClickBySelector,
    simulateRightClick
  };
})();
